WorkflowsでCloud Storage用コネクタを用いてオブジェクトのコピーと削除する方法
概要
WorkflowsでCloud Storage用のコネクタを用いると、バケット一覧の取得・メタデータの取得・オブジェクトの削除・バケットの削除などCloud Storageに対する各種操作をWorkflowsから容易に行うことができます。
そんな便利なCloud Storage用コネクタを用いて今回はCloud Storage上のオブジェクトのバケット間のコピーや削除を行ってみましたので備忘録も兼ねて記事にしてみました。
やってみる
まずはコネクタを探す
まずはコピーから試してみます。
以下のリファレンスから探します。(サンプル(Cloud Storage JSON connector sample)が載っていましたがコピーしている感じのサンプルはなさそうでした)
オブジェクト操作関連の箇所は以下でした。
下記がコピー操作をしているコネクタとあたりをつけました。
Functions | |
---|---|
copy | Copies a source object to a destination object. Optionally overrides metadata.(コピー元オブジェクトをコピー先オブジェクトにコピーします。 オプションでメタデータを上書きします。) |
Method: googleapis.storage.v1.objects.copy
上記コネクタのページにアクセスすると以下の記載が注意点として記載されています。
オブジェクト名をurl_encode関数
またはurl_encode_plus関数
を用いてURLエンコードしないとフォルダ(プレフィックス)がある場合操作に失敗するという旨の注意です。
実際にオブジェクトが以下の様なプレフィックスであった場合、エンコードしないとNot Found
エラーとなります。
hoge1/hoge2/test4.txt
上記のプレフィックスの場合はURLエンコードを適用する必要があります。
${text.url_encode("hoge1/hoge2/test4.txt")}
url_encode関数
とurl_encode_plus関数
の違いですが、これはスペースのエンコードのされ方に違いがあります。
- url_encode関数
この関数は、URLエンコードを行う際に、スペースを%20
にエンコードします。これは、一般的なURLエンコードの方法であり、RFC3986
に準拠しています。
- url_encode_plus関数
この関数は、URLエンコードを行う際に、スペースを+
にエンコードします。これは、HTMLフォームの送信時に使われるapplication/x-www-form-urlencoded
のエンコード形式に準拠しています。
両者の特徴をまとめると以下となります。
関数 | エンコード |
---|---|
text.url_encode | スペースを%20 にエンコード |
text.url_encode_plus | スペースを+ にエンコード |
今回はurl_encode関数
で進めます。
コピー方法
copyのコネクタのリファレンスを見ると以下の4つの引数が必須でした(その他にも大量の引数がありメタデータなども設定できるようですが今回は取り扱いません)。
引数 | 設定値 |
---|---|
destinationBucket | 宛先バケット名 |
destinationObject | 宛先バケットに作成するオブジェクト名 |
sourceBucket | コピー元オブジェクトのあるバケット名 |
sourceObject | コピー元オプジェクトのオブジェクト名(プレフィックス付き) |
上記をもとに実装すると以下となります、。
- init:
assign:
- dest_bucket_name: "宛先バケット名"
- dest_object_name: "宛先バケットに作成するオブジェクト名"
- src_bucket_name: "コピー元オブジェクトのあるバケット名"
- src_object_name: "コピー元オプジェクトのオブジェクト名(プレフィックス付き)"
- copy:
call: googleapis.storage.v1.objects.copy
args:
destinationBucket: ${dest_bucket_name}
destinationObject: ${text.url_encode(dest_object_name)}
sourceBucket: ${src_bucket_name}
sourceObject: ${text.url_encode(src_object_name)}
コネクタgoogleapis.storage.v1.objects.copy
を用いて、引数に必須のものを指定しています。また、オブジェクト名に関してはプレフィックスによってはエンコードが必要なのでurl_encode関数
を用いて${text.url_encode(***)}
というようにエンコードしています。
上記を実行すると指定バケットにオブジェクトがコピーされます。
削除する方法
削除も同じ調子で試してみます。まずはコネクタを探して下記のコネクタとあたりをつけました。
Method: googleapis.storage.v1.objects.delete
こちらのコネクタもcopyの場合と同様にオブジェクト名のエンコードに注意してあげる必要があります。
リファレンスを読み込むと以下の2つの引数が必須でした。
引数 | 設定値 |
---|---|
bucket | 削除対象オブジェクトが存在するバケット名 |
object | 削除対象オブジェクト名(プレフィックス付き) |
実装は以下となります。
- init:
assign:
- delete_target_bucket: "削除対象オブジェクトが存在するバケット名"
- delete_target_object: "削除対象オブジェクト名(プレフィックス付き)"
- delete:
call: googleapis.storage.v1.objects.delete
args:
bucket: ${delete_target_bucket}
object: ${text.url_encode(delete_target_object)}
上記を実行すると指定したバケットのオブジェクトが削除されます。
オブジェクトを移動する
Cloud Storage用コネクタやCloud Storage APIではオブジェクトの移動する方法として直接は提供されておらず、コピー + 元ファイルの削除という手順を踏むことになります。
せっかくなので移動(コピー + 削除)も実装してみました(組み合わせただけですが・・・)。
- init:
assign:
- dest_bucket_name: "宛先バケット名"
- dest_object_name: "宛先バケットに作成するオブジェクト名"
- src_bucket_name: "コピー元オブジェクトのあるバケット名"
- src_object_name: "コピー元オブジェクトのオブジェクト名(プレフィックス付き)"
- copy:
call: googleapis.storage.v1.objects.copy
args:
destinationBucket: ${dest_bucket_name}
destinationObject: ${text.url_encode(dest_object_name)}
sourceBucket: ${src_bucket_name}
sourceObject: ${text.url_encode(src_object_name)}
- delete:
call: googleapis.storage.v1.objects.delete
args:
bucket: ${src_bucket_name}
object: ${text.url_encode(src_object_name)}
※移動先でも同じ名前のオブジェクトにしたい場合はdestinationObject
にsrc_object_name
を指定してください。
まとめ
オブジェクト名のエンコードに注意すれば特に問題なく使えるかなと思いました。url_encode関数
またはurl_encode_plus関数
のどちらを用いるかはワークロードによるかなと思います。
Workflowsにはまだまだワクワクするコネクタがたくさんあるのでもっともっと試してみたいと思います。
それではまた。ナマステー